home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 2.iso / tomcon / tomcon2.c < prev    next >
C/C++ Source or Header  |  1991-10-19  |  5KB  |  269 lines

  1. /*
  2.     TOMCON2.C  by Y.Kurihara (Nif PDC01620)
  3.         int 29h の割り込み処理部
  4. */
  5.  
  6. #include <string.h>
  7. #include <jctype.h>
  8. #include <dos.h>
  9. #include <machine.h>
  10. #include "tomcon.h"
  11.  
  12. int  x0 = X0;
  13. int  y0 = Y0;
  14. int  xl = XL;
  15. int  yl = YL;
  16. int  lx = 0;
  17. int  ly = 0;
  18. int  code1 = 0;
  19. int  esc1 = 0;
  20. int  reverse = -1;
  21. int  fl_cur = 0;
  22. int  md_cur = 1;
  23.  
  24. void ( far *save_int29 )( void );
  25. void ( far *new_int29 )( void );
  26.  
  27. void putctl( int code )
  28. {
  29.     switch( code ) {
  30.     case 0x07:    /* BEL */
  31.     case 0x15:    /* NAK */
  32.         break;
  33.     case 0x08:    /* BS */
  34.         if( lx == 0 && ly == 0 )  break;
  35.         if( --lx < 0 ) {
  36.             lx = xl - 1;
  37.             ly--;
  38.         }
  39.         putank( ' ' );
  40.         break;
  41.     case 0x09:    /* TAB */
  42.         do {
  43.             int29( ' ' );
  44.         } while( lx % 8 );
  45.         break;
  46.     case 0x0a:    /* LF */
  47.         if( ++ly >= yl ) {
  48.             ly = yl - 1;
  49.             roll( y0,y0 + yl - 1 );
  50.         }
  51.         break;
  52.     case 0x0b:    /* VT */
  53.         lx = ly = 0;
  54.         break;
  55.     case 0x0c:    /* FF */
  56.     case 0x16:    /* SYN */
  57.         clr( y0,y0 + yl - 1 );
  58.         lx = ly = 0;
  59.         break;
  60.     case 0x0d:    /* CR */
  61.         lx = 0;
  62.         break;
  63.     case 0x1c:    /* FS */
  64.         if( lx < xl - 1 )  lx++;
  65.         break;
  66.     case 0x1d:    /* GS */
  67.         if( lx > 0 )  lx--;
  68.         break;
  69.     case 0x1e:    /* RS */
  70.         if( ly > 0 )  ly--;
  71.         break;
  72.     case 0x1f:    /* VS */
  73.         if( ly < yl - 1 )  ly++;
  74.         break;
  75.     default:
  76.         int29( '^' );
  77.         int29( code + '@' );
  78.         break;
  79.     }
  80. }
  81.  
  82. void putesc( int code )
  83. {
  84.     static int para[10];
  85.     static int count;
  86.     static int save_lx;
  87.     static int save_ly;
  88.  
  89.     if( esc1 == 1 ) {
  90.         count = 0;
  91.         para[0] = 0;
  92.         para[1] = 0;
  93.         switch( code ) {
  94.         case '[':
  95.             esc1 = 2;
  96.             return;
  97.         case '*':
  98.             clr( y0,y0 + yl - 1 );
  99.             lx = ly = 0;
  100.             break;
  101.         case 'Y':
  102.             clr( y0 + ly + 1,y0 + yl - 1 );
  103.         case 'T':
  104.             save_lx = lx;
  105.             do {
  106.                 putank( ' ' );
  107.             } while( ++lx < xl );
  108.             lx = save_lx;
  109.             break;
  110.         case 'E':
  111.             lx = 0;
  112.             roll2( y0 + ly,y0 + yl - 1 );
  113.             break;
  114.         case 'R':
  115.             roll( y0 + ly,y0 + yl - 1 );
  116.             break;
  117.         }
  118.         esc1 = 0;
  119.         return;
  120.     }
  121.  
  122.     if( isdigit( code ) ) {
  123.         para[ count ] = para[ count ] * 10 + code - '0';
  124.         return;
  125.     } else if( code == ';' ) {
  126.         count++;
  127.         para[count] = 0;
  128.         return;
  129.     } else if( code == '>' ) {
  130.         return;
  131.     }
  132.  
  133.     switch( code ) {
  134.     case 'H':
  135.     case 'f':
  136.         if( para[0] == 0 )  para[0] = 1;
  137.         if( para[1] == 0 )  para[1] = 1;
  138.         ly = para[0] - 1;
  139.         lx = para[1] - 1;
  140.         break;
  141.     case 'A':
  142.         if( para[0] == 0 )  para[0] = 1;
  143.         ly -= para[0];
  144.         break;
  145.     case 'B':
  146.         if( para[0] == 0 )  para[0] = 1;
  147.         ly += para[0];
  148.         break;
  149.     case 'C':
  150.         if( para[0] == 0 )  para[0] = 1;
  151.         lx += para[0];
  152.         break;
  153.     case 'D':
  154.         if( para[0] == 0 )  para[0] = 1;
  155.         ly -= para[0];
  156.         break;
  157.     case 's':
  158.         save_lx = lx;
  159.         save_ly = ly;
  160.         break;
  161.     case 'u':
  162.         lx = save_lx;
  163.         ly = save_ly;
  164.         break;
  165.     case 'J':
  166.         if( para[0] != 2 )  break;
  167.         clr( y0,y0 + yl - 1 );
  168.         lx = ly = 0;
  169.         break;
  170.     case 'K':
  171.         if( para[0] != 0 )  break;
  172.         save_lx = lx;
  173.         do {
  174.             putank( ' ' );
  175.         } while( ++lx < xl );
  176.         lx = save_lx;
  177.         break;
  178.     case 'm': {
  179.         int i;
  180.         for( i = 0; i <= count; i++ ) {
  181.             if( para[i] == 0 ) reverse = -1;
  182.             if( para[i] == 7 ) reverse = 0;
  183.         }
  184.         break; }
  185.     case 'v':
  186.         if( para[0] ==0 )  md_cur = 1;  else  md_cur = 0;
  187.         break;
  188.     case 'M':
  189.         lx = 0;
  190.         if( para[0] == 0 )  para[0] = 1;
  191.         while( para[0]-- > 0 )  roll( y0 + ly,y0 + yl - 1 );
  192.         break;
  193.     case 'L':
  194.         lx = 0;
  195.         if( para[0] == 0 )  para[0] = 1;
  196.         while( para[0]-- > 0 )  roll2( y0 + ly,y0 + yl - 1 );
  197.         break;
  198.     case 'l':
  199.         if( para[0] == 5 )  md_cur = 1;
  200.         break;
  201.     case 'h':
  202.         if( para[0] == 5 )  md_cur = 0;
  203.         break;
  204.     }
  205.     if( lx < 0 )   lx = 0;
  206.     if( lx >= xl ) lx = xl - 1;
  207.     if( ly < 0 )   ly = 0;
  208.     if( ly >= yl ) ly = yl - 1;
  209.     esc1 = 0;
  210.     return;
  211. }
  212.  
  213. void int29( int code )            /* 一文字表示ルーチン */
  214. {
  215.     cur( 0 );
  216.     code = code & 0xff;
  217.  
  218.     if( esc1 ) {
  219.         putesc( code );
  220.     } else if( code1 ) {            /* 漢字コード */
  221.         if( lx + 2 > xl ) {
  222.             lx = 0;
  223.             putctl( 0x0a );
  224.         }
  225.         code = ( code1 << 8 )+ code;
  226.         code = mstojis( code );
  227.         putkan( code );
  228.         lx += 2;
  229.         code1 = 0;
  230.     } else if( code == 0x1b ) {    /* エスケープコード */
  231.         esc1 = 1;
  232.     } else if( iskanji( code ) ) {    /* 漢字コードの1文字目 */
  233.         code1 = code;
  234.     } else if( code >= ' ' ) {    /* 半角文字 */
  235.         if( lx + 1 > xl ) {
  236.             lx = 0;
  237.             putctl( 0x0a );
  238.         }
  239.         putank( code );
  240.         lx++;
  241.     } else {
  242.         putctl( code );
  243.     }
  244.  
  245.     cur( md_cur );
  246. }
  247.  
  248. void set_int29()            /* INT 29H をフックする */
  249. {
  250.     static char lstack[512];
  251.     struct SREGS seg;
  252.  
  253.     segread( &seg );
  254.     new_ds = seg.ds;
  255.     new_es = seg.es;
  256.     new_ss = FP_SEG( lstack );
  257.     new_sp = FP_OFF( lstack + 510 );
  258.     new_int29 = _int29;
  259.  
  260.     save_int29 = _dos_getvect( 0x29 );
  261.     _dos_setvect( 0x29,new_int29 );
  262. }
  263.  
  264. void reset_int29()            /* INT 29H をもとに戻す */
  265. {
  266.     _dos_setvect( 0x29,save_int29 );
  267. }
  268.  
  269.